# -*- coding: utf-8 -*-
"""
    xfree.configs.default
    ~~~~~~~~~~~~~~~~~~~~~~~
    文件描述：这是每个站点都应该具有的XFree的默认配置,您可以在另一个类中重写这些配置变量。
    作者：xfree
    邮箱：cy_83k@qq.com
"""

import datetime
import os
import sys


class DefaultConfig(object):
    # 获取应用程序根路径
    basedir = os.path.join(
        os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
    )

    # Python 版本
    py_version = "{0.major}{0.minor}".format(sys.version_info)

    # Flask 设置
    # ------------------------------
    # 这里有更多的设置：http://flask.pocoo.org/docs/0.11/config/#builtin-configuration-values
    # 调试模式
    DEBUG = True
    # 测试模式
    TESTING = True

    # 服务器名称
    # 服务器的名称和端口号。
    # 对于子域名支持（例如：'myapp.dev:5000'）和
    # 在没有请求上下文但有应用程序上下文的情况下生成 URL 是必需的
    # 请注意，localhost 不支持子域名，因此将其设置为
    # “localhost” 没有帮助。
    # 例如，对于 xfree 论坛：SERVER_NAME = "bbs.xfree.cn"
    # SERVER_NAME = "localhost:5000"
    # 首选的 URL 方案。在生产环境中，强烈建议使用 'https'。
    # 这仅影响使用 'url_for' 生成的 URL。
    PREFERRED_URL_SCHEME = "http"

    # 允许的主机
    # 被认为是“安全”的主机列表，在重定向时将被考虑
    # urls。如果设置为 None，则仅当前服务此网站的主机
    # 将被视为“安全”。
    ALLOWED_HOSTS = None

    # 日志设置
    # ------------------------------
    # 此配置部分将处理 xfree 的日志设置，根据需要进行调整。

    # 日志配置文件路径
    # 请参阅 https://docs.python.org/library/logging.config.html#logging.config.fileConfig
    # 有关更多详细信息。应为 None 或文件路径
    # 如果设置为文件路径，则应为绝对文件路径
    LOG_CONF_FILE = None

    # 存储 INFO 和 ERROR 日志的路径
    # 如果为 None，则默认为 xfree/logs
    #
    # 如果设置为文件路径，则应为绝对路径
    LOG_PATH = os.path.join(basedir, "xfree","logs")

    LOG_DEFAULT_CONF = {
        "version": 1,
        "disable_existing_loggers": False,
        "formatters": {
            "standard": {
                "format": "%(asctime)s %(levelname)-7s %(name)-25s %(message)s"
            },
            "advanced": {
                "format": "%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]"
            },
        },
        "handlers": {
            "console": {
                "level": "NOTSET",
                "formatter": "standard",
                "class": "logging.StreamHandler",
            },
            "xfree": {
                "level": "DEBUG",
                "formatter": "standard",
                "class": "logging.handlers.RotatingFileHandler",
                "filename": os.path.join(LOG_PATH, "xfree.log"),
                "mode": "a",
                "maxBytes": 10485760,  # 10MB
                "backupCount": 5,
            },
            "infolog": {
                "level": "INFO",
                "formatter": "standard",
                "class": "logging.handlers.RotatingFileHandler",
                "filename": os.path.join(LOG_PATH, "info.log"),
                "mode": "a",
                "maxBytes": 10485760,  # 10MB
                "backupCount": 5,
            },
            "errorlog": {
                "level": "ERROR",
                "formatter": "standard",
                "class": "logging.handlers.RotatingFileHandler",
                "filename": os.path.join(LOG_PATH, "error.log"),
                "mode": "a",
                "maxBytes": 10485760,  # 10MB
                "backupCount": 5,
            },
        },
        "loggers": {
            "flask.app": {
                "handlers": ["infolog", "errorlog"],
                "level": "INFO",
                "propagate": True,
            },
            "xfree": {
                "handlers": ["console", "xfree"],
                "level": "WARNING",
                "propagate": True,
            },
        },
    }

    # 当设置为 True 时，将启用默认的
    # xfree 日志配置，该配置使用以下设置确定日志记录
    USE_DEFAULT_LOGGING = True

    # 如果 SEND_LOGS 设置为 True，管理员（请参阅邮件配置）将收到错误日志的电子邮件。
    SEND_LOGS = False

    # 数据库
    # ------------------------------
    # 对于 MySQL：
    # SQLALCHEMY_DATABASE_URI="mysql+pymysql://xfree:password@localhost:3306/xfree"
    # 对于 PostgresSQL：
    # SQLALCHEMY_DATABASE_URI = "postgresql://xfree@localhost:5432/xfree"
    # 对于 SQLite：
    SQLALCHEMY_DATABASE_URI = "sqlite:///" + basedir + "/" + "xfree.sqlite"

    # 此选项将在 Flask-SQLAlchemy 移除后立即删除。
    # 目前，它仅用于抑制非常烦人的警告
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 这将打印所有 SQL 语句
    SQLALCHEMY_ECHO = False

    ALEMBIC = {
        "script_location": os.path.join(basedir, "xfree/migrations"),
        "version_locations": "",
        "file_template": "%%(year)d%%(month).2d%%(day).2d%%(hour).2d%%(minute).2d_%%(rev)s_%%(slug)s",
    }
    ALEMBIC_CONTEXT = {"render_as_batch": True}

    # 安全
    # ------------------------------
    # 这是用于会话签名的秘密密钥。
    # 你可以使用 os.urandom(24) 生成安全密钥
    SECRET_KEY = "secret key"

    # 你可以使用与生成 SECRET_KEY 相同的方式生成 WTF_CSRF_SECRET_KEY。如果未提供 WTF_CSRF_SECRET_KEY，它将使用 SECRET_KEY。
    WTF_CSRF_ENABLED = True
    WTF_CSRF_SECRET_KEY = "reallyhardtoguess"

    # 全文搜索
    # ------------------------------
    # 这将使用 "whoosh_index" 目录存储搜索索引
    WHOOSHEE_DIR = os.path.join(basedir, "whoosh_index", py_version)
    # whooshee 尝试获取写锁的时间（默认为 2）
    WHOOSHEE_WRITER_TIMEOUT = 2
    # 搜索的最小字符数（默认为 3）
    WHOOSHEE_MIN_STRING_LEN = 3

    # 认证
    # ------------------------------
    LOGIN_VIEW = "auth.login"
    REAUTH_VIEW = "auth.reauth"
    LOGIN_MESSAGE_CATEGORY = "info"
    REFRESH_MESSAGE_CATEGORY = "info"

    # 用于存储“记住我”信息的 cookie 名称。
    REMEMBER_COOKIE_NAME = "remember_token"
    # cookie 过期前的时间，作为 datetime.timedelta 对象。
    REMEMBER_COOKIE_DURATION = datetime.timedelta(days=365)
    # 如果“记住我”cookie 应跨域，在此处设置域值（例如，.example.com 将允许 cookie
    # 在 example.com 的所有子域上使用）。
    REMEMBER_COOKIE_DOMAIN = None
    # 将“记住我”cookie 限制到特定路径。
    REMEMBER_COOKIE_PATH = "/"
    # 将“记住我”cookie 的范围限制为安全通道（通常为 HTTPS）。
    REMEMBER_COOKIE_SECURE = None
    # 防止“记住我”cookie 被客户端脚本访问。
    REMEMBER_COOKIE_HTTPONLY = False

    # 通过 Flask-Limiter 进行速率限制
    # -------------------------------
    # 有关配置值的完整列表，请参阅 flask-limiter 文档，但实际上你只需要以下设置。
    # 你也可以在此处禁用速率限制器 - 它将覆盖
    # 管理面板中的设置！
    # RATELIMIT_ENABLED = True
    # 你可以选择：
    #   memory://（默认）
    #   redis://host:port
    #   memcached://host:port
    # 使用 redis 存储需要安装 redis 包，如果启用 REDIS_ENABLE，则会安装该包
    # 而 memcached 依赖于 pymemcache 包。
    # RATELIMIT_STORAGE_URL = "redis://localhost:6379"

    # 缓存
    # ------------------------------
    # 有关所有可用缓存类型的信息，请参阅 Flask-Cache 文档
    # https://pythonhosted.org/Flask-Caching/#configuring-flask-caching
    CACHE_TYPE = "SimpleCache"
    # 对于 redis：
    # CACHE_TYPE = "redis"
    CACHE_DEFAULT_TIMEOUT = 60

    # 邮件
    # ------------------------------
    # 谷歌邮件示例
    # MAIL_SERVER = "smtp.gmail.com"
    # MAIL_PORT = 465
    # MAIL_USE_SSL = True
    # MAIL_USERNAME = "your_username@gmail.com"
    # MAIL_PASSWORD = "your_password"
    # MAIL_DEFAULT_SENDER = ("Your Name", "your_username@gmail.com")

    # 本地 SMTP 服务器
    MAIL_SERVER = "localhost"
    MAIL_PORT = 25
    MAIL_USE_SSL = False
    MAIL_USE_TLS = False
    MAIL_USERNAME = "cy_83k@qq.com"
    MAIL_PASSWORD = "xf!0557980.."
    MAIL_DEFAULT_SENDER = ("Default Sender", "cy_83k@qq.com")
    # 日志应将电子邮件发送到的位置
    ADMINS = ["cy_83k@qq.com"]

    # Redis
    # ------------------------------ #
    # 如果启用 redis，它可用于：
    #   - 通过 Celery（任务队列）发送非阻塞电子邮件
    #   - 缓存
    #   - 速率限制
    REDIS_ENABLED = False
    REDIS_URL = "redis://localhost:6379"  # 或使用密码："redis://:password@localhost:6379"
    REDIS_DATABASE = 0

    # Celery
    CELERY_CONFIG = {
        "broker_url": "redis://localhost:6379",
        "result_backend": "redis://localhost:6379",
        "broker_transport_options": {"max_retries": 1},
    }

    # xfree 设置
    # ------------------------------ #
    # URL 前缀
    FORUM_URL_PREFIX = ""
    USER_URL_PREFIX = "/user"
    MESSAGE_URL_PREFIX = "/message"
    AUTH_URL_PREFIX = "/auth"
    ADMIN_URL_PREFIX = "/admin"

    # 移除死亡插件 - 如果要将实例迁移到其他位置并忘记重新安装插件，这很有用。
    # 如果设置为 `False`，它将不会移除未安装在文件系统上的插件（虚拟环境，site-packages）。
    REMOVE_DEAD_PLUGINS = False